//
// Created by 花如锦 on 2024/5/12.
//

#ifndef DEMO20240512_TESTCLION_AUTOPOINTER_H
#define DEMO20240512_TESTCLION_AUTOPOINTER_H

#endif //DEMO20240512_TESTCLION_AUTOPOINTER_H
#include "PointerRef.h"

template<typename T>
class AutoPointer {
public:
    // 析构函数
    ~AutoPointer();

    // 构造初始化
    AutoPointer() : t(nullptr) {}

    // 有参构造初始化
    explicit AutoPointer(T* Pointer) : t(Pointer) {
        // 新增计数器
        PointerRef::GetInstance()->AddRef(Pointer);
    }

    // 拷贝构造
    AutoPointer(AutoPointer&);

    // 重载 指针 运算符，把当前对象伪装成范型
    T* operator -> () const {
        return t;
    }

    // 重载 解引用 运算符，把当前对象伪装成范型
    T& operator * () const {
        return *t;
    }

    // 重载 布尔 运算符
    // explicit 限定只能转换bool
    explicit operator bool () {
        return t != nullptr;
    }

private:
    T* t;
};